#ifndef LOGGER_H
#define LOGGER_H

#include <string>
#include <fstream>
#include "singleton.h"

using namespace std;

//! Logger 
/*
	Logger ma identyczna funkcjonalnosc jak strumien cout.
	Loguje do pliku LOG.txt
*/
class Logger
{
 friend class Singleton< Logger >;

 public:

	template<class T>
	Logger& operator<<(const T& info);

	Logger& operator<<(ostream& (*pFunc)(ostream&));

	//! Zwraca status loggera (wlaczony lub wylaczony).
	bool IsOn()
	{ return isOn; }

	//! Wlacza wylacza logger
	/*
		Jesli logger jest wylaczony zadne tekst nie laduje do pliku. Mozna swobodnie w dowolnym momencie wlaczac, wylaczac logger.
		Defaultowo jest wlaczony.
	*/
	void EnableDisable( bool state )
	{ isOn = state; }

 private:

	string path;
	bool isOn;
	ofstream os;

	void LoggerHeader();

	Logger::Logger() : isOn(true), path("LOG.txt")
	{
		os.open( path.c_str() );
		LoggerHeader();
	}

	Logger(const Logger& rhs);

	
};



//--------------------------------------------------- operator<< ---------------------------------------------//
//metoda szablonowa wiec musi isc do pliku .h
template<class T>
Logger& Logger::operator<<(const T& info)
{
	if (isOn)
		os << info;

	return *this;
}

//--------------------------------------------------- define -------------------------------------------------//
/*
	Uzywamy tak;
	logout << "blablablabla" << endl;
*/
#define logout (*Singleton< Logger >::Instance()) 


#endif